﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace Model
{
    [Serializable()]
    public class Zijde : ISerializable
    {
        private bool geactiveert;
        private int nummer;
        private int schapteller;
        private Point een;
        public Point PuntEen
        {
            get { return een; }
        }
        private Point twee;
        public Point PuntTwee
        {
            get { return twee; }
        }
        private List<Schap> schappen = new List<Schap>(); //De lijst van schappen in het rek        


        /// <summary>
        /// Serialize constructor
        /// </summary>
        /// <param name="info"></param>
        /// <param name="ctxt"></param>
        public Zijde(SerializationInfo info, StreamingContext ctxt)
        {
            this.geactiveert = (bool)info.GetValue("Geactiveert", typeof(bool));
            this.nummer = (int)info.GetValue("Nummer", typeof(int));
            this.schapteller = (int)info.GetValue("Schapteller", typeof(int));
            this.een = (Point)info.GetValue("Een", typeof(Point));
            this.twee = (Point)info.GetValue("Twee", typeof(Point));
            this.schappen = (List<Schap>)info.GetValue("Schappen", typeof(List<Schap>));
        }

        /// <summary>
        /// Een zijde van een rek (constructor)
        /// </summary>
        /// <param name="een">Een van de twee punten waartussen de zijde zit</param>
        /// <param name="twee">Een van de twee punten waartussen de zijde zit</param>
        public Zijde(Point een, Point twee, int nummer)
        {
            this.nummer = nummer;
            this.een = een;
            this.twee = twee;
            schapteller = 0;
        }

        public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
        {
            info.AddValue("Geactiveert", this.geactiveert);
            info.AddValue("Nummer", this.nummer);
            info.AddValue("Schapteller", this.schapteller);
            info.AddValue("Een", this.een);
            info.AddValue("Twee", this.twee);
            info.AddValue("Schappen", this.schappen);
        }

        public bool Geactiveert
        {
            get { return geactiveert; }
            set { geactiveert = value; }
        }

        public List<Schap> Schappen
        {
            get { return schappen; }
        }

       

        /// <summary>
        /// Voegt een schap toe aan het rek maar verwijdert het nummer van de schap;
        /// </summary>
        /// <param name="schap">Het toe te voegen schap</param>
        public void VoegSchapToe(Schap schap)
        {
            Schap temp = new Schap(schap.Een,schap.Twee,schapteller++);
            temp.Artikelen = schap.Artikelen;
            schappen.Add(schap);
        }

        /// <summary>
        /// Verwijdert een schap uit het rek
        /// </summary>
        /// <param name="schap">Het te verwijderen schap</param>
        public void VerwijderSchap(int schap)
        {
            //this.schappen.Remove(schap);
            Schappen.RemoveAt(schap);
            int i = schap;
            for (; i < Schappen.Count; i++)
            {
                Schappen[i].Nummer = Schappen[i].Nummer - 1;
            }
        }
    }
}
